Poned vuestro nombre arriba, done pone “author:”. No os olvidéis de las comillas.
Poned también vuestro nombre en los archivos .Rmd y .html que generéis.
Tienes que subir al moodle el archivo .html y el .Rmd.
La fecha límite de entrega es el lunes 25 de noviembre a las 23:55.
Recordatorio: para resolver los ejercicios tienes que crear chunks donde escribir el código. Puedes crear un chunk para cada ejercicio o para cada pregunta; haz lo que te sea más cómodo, pero mi recomendación es que los chunks sean pequeños.
Si tenéis alguna pregunta no dudéis en escribirme a eudald@correig.net.
Nota: en terminar los ejercicios tenéis que darle a Knit para que se genere el informe html. Ahora, no os esperéis a tenerlo todo terminado para generar el informe; generadlo antes de empezar y también cada vez que terminéis un chunk.
library("openxlsx")
library("ggplot2")
Se pretende identificar ineficiencias en el proceso de venta o factores internos y externos que pueden estar impactando el rendimiento de las mismas de una empresa de dispositivos electrónicos para las franquicias de todo el país.
Las variables son las siguientes:
Teniendo en cuenta la descripción de cada variable, y los valores que véis en éstas, formatead correctamente el dataframe.
En primer lugar abrimos la tabla y la asignamos a la variable dades.
dades = read.xlsx("datos/DatosPractica.xlsx")
Una vez tenemos la tabla, usamos el comando structure para saber el tipo de variable que R le ha asignado a cada una:
str(dades)
## 'data.frame': 4403 obs. of 18 variables:
## $ REGISTRO : num 1 2 3 4 5 6 7 8 9 10 ...
## $ PROVINCIA : chr "Albacete" "Albacete" "Albacete" "Albacete" ...
## $ rentabieco : num 0.86 -4.748 -0.322 12.99 1.461 ...
## $ rentabifin : num 8.4 -20.15 -1.93 28.38 55.74 ...
## $ endp : num 89.8 76.4 83.3 54.2 97.4 ...
## $ liq : num 1.102 1.308 0.854 1.577 1.009 ...
## $ PRODUCTIVIDAD : num 114.9 146.4 11.7 19.3 37 ...
## $ VENTAS : num 1270 338 17715 20848 1239 ...
## $ NÚMERO.DE.EMPLEADOS: num 1 1 46 40 2 54 1 2 8 2 ...
## $ coe : num 0.00493 0.00131 0.06871 0.08086 0.0048 ...
## $ edad : num 2 8 25 24 2 40 10 11 10 15 ...
## $ conce : num 9 9 34 34 3 34 34 34 9 34 ...
## $ numac : num 1 0 3 3 0 1 1 1 3 0 ...
## $ numpa : num 0 0 0 0 0 0 0 0 0 0 ...
## $ numest : num 1 1 2 2 2 7 1 1 1 2 ...
## $ estp : num 0 0 0 0 0 1 0 0 0 0 ...
## $ grupo : num 0 0 0 0 0 0 0 0 0 0 ...
## $ fju : num 0 0 1 1 0 1 0 0 1 1 ...
Cambiamos las variables “estp”, “grupo” y “fju” a variables categóricas y comprobamos de nuevo, además suprimimos la primera columna REGISTRO:
dades$REGISTRO=NULL
dades$estp=as.factor(dades$estp)
dades$grupo=as.factor(dades$grupo)
dades$fju=as.factor(dades$fju)
str(dades)
## 'data.frame': 4403 obs. of 17 variables:
## $ PROVINCIA : chr "Albacete" "Albacete" "Albacete" "Albacete" ...
## $ rentabieco : num 0.86 -4.748 -0.322 12.99 1.461 ...
## $ rentabifin : num 8.4 -20.15 -1.93 28.38 55.74 ...
## $ endp : num 89.8 76.4 83.3 54.2 97.4 ...
## $ liq : num 1.102 1.308 0.854 1.577 1.009 ...
## $ PRODUCTIVIDAD : num 114.9 146.4 11.7 19.3 37 ...
## $ VENTAS : num 1270 338 17715 20848 1239 ...
## $ NÚMERO.DE.EMPLEADOS: num 1 1 46 40 2 54 1 2 8 2 ...
## $ coe : num 0.00493 0.00131 0.06871 0.08086 0.0048 ...
## $ edad : num 2 8 25 24 2 40 10 11 10 15 ...
## $ conce : num 9 9 34 34 3 34 34 34 9 34 ...
## $ numac : num 1 0 3 3 0 1 1 1 3 0 ...
## $ numpa : num 0 0 0 0 0 0 0 0 0 0 ...
## $ numest : num 1 1 2 2 2 7 1 1 1 2 ...
## $ estp : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ...
## $ grupo : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
## $ fju : Factor w/ 2 levels "0","1": 1 1 2 2 1 2 1 1 2 2 ...
Para el desarrollo de este estudio se sugiere seguir las siguientes instrucciones:
Análisis descriptivo. Estudiar la distribución de las variables, así como detectar posibles valores atípicos o relaciones.
En el siguiente apartado vamos a analizar la distribución de las diferentes variables, en el caso de las numéricas empezaremos haciendo un histograma para ver su distribución y realizaremos el test de Shapiro Wilk para confirmar si siguen una distribución normal o no. En el test de Shapiro Wilk planteamos como hipótesis nula que la variable tiene una distribución normal, si p-value es menor de 0.05 rechazamos la hipótesis nula y por tanto aceptaremos la hipótesis alternativa, en este caso que la variable no tiene un distribución normal. En función de la distribución de los datos de la variable daremos más importancia a la media (si es normal) o a la mediana (sino es normal). Añadiremos también un boxplot de las variables numéricas para resaltar la aparición de posibles outliers.
Empezamos analizando la primera variable numérica: Rentabilidad Económica
summary(dades$rentabieco) #Usamos la función summary que nos devuelve el resumen de la varibale.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -179.7045 0.1294 1.7748 0.7648 4.8275 48.4145
shapiro.test(dades$rentabieco) #Shapiro test para ver si la variable sigue una distribución normal o no, si p>0.05 la consideraremos normal.
##
## Shapiro-Wilk normality test
##
## data: dades$rentabieco
## W = 0.62281, p-value < 2.2e-16
hist(dades$rentabieco, xlab = "Rentabilidad Económica", main = NULL) #Hacemos un histograma para confirmar la distribución de los datos.
La distribución de la variable no es normal según Shapiro test, y además lo confirmamos con un histograma. Vemos que la distribución de los datos tiene cola a la izquierda, los datos están sesgados a la izquierda. Podemos ver que la mediana se sitúa en el valor 1.77, que es el valor central, viendo que el valor mínimo es -179.70 y el mayor 48.41. Al no seguir una distribución normal la media no es representativa.
Terminamos el análisis con un boxplot para remarcar la aparición de los outliers:
boxplot(dades$rentabieco)
Seguimos con el análisis de la rentabilidad financiera:
summary(dades$rentabifin)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -459.480 2.658 10.671 16.198 24.988 494.178
hist(dades$rentabifin, xlab = "Rentabilidad Financiera", main = NULL)
shapiro.test(dades$rentabifin)
##
## Shapiro-Wilk normality test
##
## data: dades$rentabifin
## W = 0.67036, p-value < 2.2e-16
Al hacer el histograma y el shapiro test podemos confirmar que la variable no sigue una distribución normal.
boxplot(dades$rentabifin)
Nivel de endeudamiento de las franquicias:
summary(dades$endp)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 61.21 79.15 79.53 93.25 433.21
hist(dades$endp, xlab = "Endeudamiento franquicias", main = NULL)
shapiro.test(dades$endp)
##
## Shapiro-Wilk normality test
##
## data: dades$endp
## W = 0.81696, p-value < 2.2e-16
Lo primero que observamos al hacer el summary es que hay outliers, vemos que la mediana es 79.15 y el valor máximo 433.21, además lo confirmamos con el histograma, que nos da sesgo a la derecha. Por otro lado el endeudamiento tampoco sigue una distribución normal.
boxplot(dades$endp)
Liquidez financiera:
summary(dades$liq)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01527 0.94691 1.15317 1.90566 1.54464 113.15031
hist(dades$liq, xlab = "Liquidez financiera", main = NULL)
shapiro.test(dades$liq)
##
## Shapiro-Wilk normality test
##
## data: dades$liq
## W = 0.17047, p-value < 2.2e-16
Se repite la aparición de outliers, con la mediana en 1.15, el 3r cuartil en 1.54 y el valor máximo en 113.15. El histograma nos muestra que la mayoría de datos están entre 0 y 10 aproximadamente, habiendo sesgo a la derecha. El shapiro test nos confirma la no normalidad de la variable.
boxplot(dades$liq)
Productividad:
summary(dades$PRODUCTIVIDAD)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1.172 5.085 11.755 16.224 18.783 268.593
hist(dades$PRODUCTIVIDAD, xlab = "Productividad", main = NULL)
shapiro.test(dades$PRODUCTIVIDAD)
##
## Shapiro-Wilk normality test
##
## data: dades$PRODUCTIVIDAD
## W = 0.58933, p-value < 2.2e-16
boxplot(dades$PRODUCTIVIDAD)
Igual que en los anteriores casos, nos encontramos con una variable con outliers hacia la derecha del gráfico histograma, con el tercer cuartil situado en 18.783 y el valor máximo en 268.593. El histograma de la variable confirma el sesgo a la derecha y la repartición de la mayoría de los datos entre 0 y 50 aproximadamente, encontrando la mediana en 11.755. Shapiro test nos da la confirmación de que la variable no sigue una distribución normal.
Ventas:
summary(dades$VENTAS)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.92 494.89 1592.14 6648.16 7819.91 77055.79
hist(dades$VENTAS, xlab = "Ventas", main = NULL)
shapiro.test(dades$VENTAS)
##
## Shapiro-Wilk normality test
##
## data: dades$VENTAS
## W = 0.62097, p-value < 2.2e-16
boxplot(dades$VENTAS)
Variable con distribución no normal, tenemos la mediana en 1592.14 con el valor máximo en 77055.79, tenemos el tercer cuartil en 7819.91, quedando reflejado en el boxplot.
Cuota de mercado:
summary(dades$coe)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000012 0.0004909 0.0021491 0.0118101 0.0106936 0.5060498
hist(dades$coe, xlab = "Cuota de mercado", main = NULL)
shapiro.test(dades$coe)
##
## Shapiro-Wilk normality test
##
## data: dades$coe
## W = 0.47735, p-value < 2.2e-16
boxplot(dades$coe)
Variable con distribución no normal, sesgo a la derecha. Confirmamos también con el histograma. El summary nos dice que tenemos la mediana en 0.0021 y el valor máximo en 0.50, aparecen outliers otra vez.
Tiempo que las franquicias llevan operando:
summary(dades$edad)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 5.00 11.00 12.29 18.00 49.00
hist(dades$edad, xlab = "Tiempo franquicias operando", main = NULL)
shapiro.test(dades$edad)
##
## Shapiro-Wilk normality test
##
## data: dades$edad
## W = 0.92737, p-value < 2.2e-16
boxplot(dades$edad)
Variable con distribución no normal, aparición de outliers en rango superior, confirmamos con boxplot.
Número de entidades que dan este mismo servicio a nivel de municipio:
summary(dades$conce)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.0 4.0 11.0 29.8 28.0 215.0
hist(dades$conce, xlab = "Nº entidades que dan el mismo servicio en municipio", main = NULL)
shapiro.test(dades$conce)
##
## Shapiro-Wilk normality test
##
## data: dades$conce
## W = 0.55731, p-value < 2.2e-16
str(dades$conce)
## num [1:4403] 9 9 34 34 3 34 34 34 9 34 ...
Variable con un mínimo de 1, una mediana de 11 y un valor máximo de 215, confirma aparición de outliers. Distribución no normal.
Número de accionistas:
summary(dades$numac)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 1.000 1.228 2.000 17.000
hist(dades$numac, xlab = "Número accionistas", main = NULL)
shapiro.test(dades$numac)
##
## Shapiro-Wilk normality test
##
## data: dades$numac
## W = 0.72155, p-value < 2.2e-16
boxplot(dades$numac)
Variable con un mínimo de 0, una mediana de 1 y un máximo de 17. No normalidad, histograma sesgado a la derecha.
Número de participados:
summary(dades$numpa)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0000 0.0000 0.1687 0.0000 20.0000
hist(dades$numpa, xlab = "Número participados", main = NULL)
shapiro.test(dades$numpa)
##
## Shapiro-Wilk normality test
##
## data: dades$numpa
## W = 0.23741, p-value < 2.2e-16
El número de participados vuelve a seguir una distribución no normal, hacemos histograma y confirmamos con Shapiro Test, y además añadimos que tenemos una mediana de 0, un mínimo de 0 y un máximo de 20. Gráfico totalmente sesgado hacia la derecha.
boxplot(dades$numpa)
Número de establecimientos por empresa:
summary(dades$numest)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.000 1.714 2.000 34.000
hist(dades$numest, xlab = "Número establecimientos empresa", main = NULL)
shapiro.test(dades$numest)
##
## Shapiro-Wilk normality test
##
## data: dades$numest
## W = 0.54378, p-value < 2.2e-16
boxplot(dades$numest)
Variable no normal con sesgo a la derecha. Mediana de 1 y valor máximo de 34. Presencia de outliers.
En cuanto a las variables Número de establecimientos en otras provincias, grupo y fju, las consideramos categóricas porque su rango va de 0 a 1.
summary(dades$estp)
## 0 1
## 4264 139
summary(dades$grupo)
## 0 1
## 4164 239
summary(dades$fju)
## 0 1
## 3181 1222
Para finalizar hacemos un gráfico pairs para comparar todas las variables, creo un nuevo dataframe en el que suprimero la variable provincia, ya que en este gráfico todas las variables tienen que ser numéricas:
dades2 = dades
dades2$PROVINCIA=NULL
dades2$estp = as.numeric(dades2$estp)
dades2$grupo = as.numeric(dades2$grupo)
dades2$fju = as.numeric(dades$fju)
pairs(dades2)
Además añadimos un dataframe con las correlaciones entre variables para ver el marco general, y poder extraer además conclusiones para el siguiente ejercicio:
cor(dades2[1:13], method = "spearman")
## rentabieco rentabifin endp liq
## rentabieco 1.00000000 0.36063104 -0.49535976 0.365129667
## rentabifin 0.36063104 1.00000000 0.17409743 -0.075473148
## endp -0.49535976 0.17409743 1.00000000 -0.664222822
## liq 0.36512967 -0.07547315 -0.66422282 1.000000000
## PRODUCTIVIDAD 0.16232276 0.15659382 0.03998395 0.024368435
## VENTAS 0.23545994 -0.05019929 -0.28476237 0.135286336
## NÚMERO.DE.EMPLEADOS 0.17415877 -0.13992167 -0.32746949 0.117031793
## coe 0.22037068 -0.04160632 -0.26692504 0.113894237
## edad 0.13780245 -0.25651913 -0.42390922 0.216409704
## conce -0.02746532 -0.03703723 -0.01807275 -0.004232505
## numac 0.16020660 -0.06260424 -0.25089611 0.122707612
## numpa 0.05522389 -0.07329598 -0.16198863 0.052378331
## numest 0.08515270 -0.03323358 -0.11384735 0.017630458
## PRODUCTIVIDAD VENTAS NÚMERO.DE.EMPLEADOS
## rentabieco 0.16232276 0.23545994 0.1741588
## rentabifin 0.15659382 -0.05019929 -0.1399217
## endp 0.03998395 -0.28476237 -0.3274695
## liq 0.02436843 0.13528634 0.1170318
## PRODUCTIVIDAD 1.00000000 0.49029662 0.0036268
## VENTAS 0.49029662 1.00000000 0.8123219
## NÚMERO.DE.EMPLEADOS 0.00362680 0.81232190 1.0000000
## coe 0.42332048 0.84255657 0.6989915
## edad -0.09939556 0.41226494 0.5336445
## conce 0.19353420 0.26089027 0.1595496
## numac 0.18414947 0.53966169 0.4929155
## numpa 0.05331649 0.32548523 0.3373081
## numest 0.10561006 0.42548731 0.4277879
## coe edad conce numac
## rentabieco 0.22037068 0.13780245 -0.027465322 0.16020660
## rentabifin -0.04160632 -0.25651913 -0.037037225 -0.06260424
## endp -0.26692504 -0.42390922 -0.018072747 -0.25089611
## liq 0.11389424 0.21640970 -0.004232505 0.12270761
## PRODUCTIVIDAD 0.42332048 -0.09939556 0.193534195 0.18414947
## VENTAS 0.84255657 0.41226494 0.260890269 0.53966169
## NÚMERO.DE.EMPLEADOS 0.69899154 0.53364450 0.159549619 0.49291547
## coe 1.00000000 0.36709630 0.123245143 0.47762343
## edad 0.36709630 1.00000000 0.049875576 0.33412672
## conce 0.12324514 0.04987558 1.000000000 0.13604781
## numac 0.47762343 0.33412672 0.136047805 1.00000000
## numpa 0.27739539 0.25615885 0.099889112 0.25645230
## numest 0.34799831 0.23181796 0.113542386 0.26779229
## numpa numest
## rentabieco 0.05522389 0.08515270
## rentabifin -0.07329598 -0.03323358
## endp -0.16198863 -0.11384735
## liq 0.05237833 0.01763046
## PRODUCTIVIDAD 0.05331649 0.10561006
## VENTAS 0.32548523 0.42548731
## NÚMERO.DE.EMPLEADOS 0.33730810 0.42778786
## coe 0.27739539 0.34799831
## edad 0.25615885 0.23181796
## conce 0.09988911 0.11354239
## numac 0.25645230 0.26779229
## numpa 1.00000000 0.22002050
## numest 0.22002050 1.00000000
Análisis del Comportamiento de las Ventas y Variables que le Afectan.
Para entender como afectan otras variables a la ventas tenemos que hacer un test de correlación, para demostrar si hay correlación entre las dos variables, haríamos un test de correlación de Fisher si las variables tienen una distribución normal y el de “Spearman” si una de ellas no sigue una distribución normal. Para realizar los tests consideramos la variable VENTAS la variable dependiente, ya que queremos saber cómo se ve afectada en función de los cambios que suceden en las variables independientes. Anteriormente con el gráfico pairs y la matriz de correlación ya hemos intuïdo que hay cierta correlación entre las ventas y el número de empleados, la cuota de mercado y el número de establecimientos por empresa, pero vamos a hacer los test con todas las variables para confirmar.
Ventas en relación con la Rentabilidad Económica:
cor.test(dades$rentabieco, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$rentabieco, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$rentabieco and dades$VENTAS
## S = 1.0877e+10, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.2354599
No hay correlación.
Ventas con rentabilidad financiera: no hay correlación
cor.test(dades$rentabifin, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$rentabifin, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$rentabifin and dades$VENTAS
## S = 1.4941e+10, p-value = 0.0008618
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## -0.05019929
Ventas con el nivel de endeudamiento de las franquicias: no hay correlación:
cor.test(dades$endp, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$endp, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$endp and dades$VENTAS
## S = 1.8278e+10, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## -0.2847624
Influencia que tiene la Productividad en las ventas:
cor.test(dades$PRODUCTIVIDAD, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$PRODUCTIVIDAD, dades$VENTAS, method =
## "sp"): Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$PRODUCTIVIDAD and dades$VENTAS
## S = 7251240260, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.4902966
El test de Spearman nos da una rho de 0.49 con un p-value muy significativo, dando mucha validez al test. Obtenemos una baja correlación positiva. Hacemos un qqplot para comprobar visualmente el resultado:
qqplot(dades$PRODUCTIVIDAD, dades$VENTAS, xlab = "Productividad", ylab = "Ventas")
Aquí si que se intuye la recta.
Ventas en función del número de empleados:
cor.test(dades$NÚMERO.DE.EMPLEADOS, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$NÚMERO.DE.EMPLEADOS, dades$VENTAS, method
## = "sp"): Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$NÚMERO.DE.EMPLEADOS and dades$VENTAS
## S = 2.67e+09, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.8123219
plot(dades$NÚMERO.DE.EMPLEADOS, dades$VENTAS, xlab = "Número de empleados", ylab = "Ventas")
qqplot(dades$NÚMERO.DE.EMPLEADOS, dades$VENTAS, xlab = "Número de empleados", ylab = "Ventas")
Mucha significancia del test con un p-value muy pequeño (casi 0) y un resultado rho de 0.81, buena correlación positiva que se ve plasmada en ambos gráficos.
Ventas sobre Cuota de mercado:
cor.test(dades$coe, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$coe, dades$VENTAS, method = "sp"): Cannot
## compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$coe and dades$VENTAS
## S = 2239852029, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.8425566
qqplot(dades$coe, dades$VENTAS, xlab = "Cuota de mercado", ylab = "Ventas")
Mucha correlación 0.85 y muy buena significancia del test.
Ventas en función del tiempo que llevan las franquicias operando: baja correlación positiva
cor.test(dades$edad, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$edad, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$edad and dades$VENTAS
## S = 8361349609, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.4122649
Ventas en función del número de entidades que dan el mismo servicio a nivel de municipio: no hay correlación
cor.test(dades$conce, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$conce, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$conce and dades$VENTAS
## S = 1.0515e+10, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.2608903
Ventas en función del número de accionistas: baja correlación positiva
cor.test(dades$numac, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$numac, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$numac and dades$VENTAS
## S = 6.549e+09, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.5396617
Ventas sobre número de participados: muy baja correlación.
cor.test(dades$numpa, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$numpa, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$numpa and dades$VENTAS
## S = 9595911793, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.3254852
Ventas en función del número de establecimientos por empresa: baja correlación positiva
cor.test(dades$VENTAS, dades$numest, method = "sp")
## Warning in cor.test.default(dades$VENTAS, dades$numest, method = "sp"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: dades$VENTAS and dades$numest
## S = 8173242936, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.4254873
Ventas en función del número de establecimientos en otras provincias: en este caso como consideramos la variable número de establecimientos categórica, tenemos que hacer el test de Chi cuadrado
chisq.test(dades$estp, dades$VENTAS)
## Warning in chisq.test(dades$estp, dades$VENTAS): Chi-squared approximation
## may be incorrect
##
## Pearson's Chi-squared test
##
## data: dades$estp and dades$VENTAS
## X-squared = 4403, df = 4398, p-value = 0.4759
plot(dades$estp, dades$VENTAS, xlab = "Nº Establecimientos", ylab= "Ventas")
P-value nos da mayor de 0.05, aceptamos la hipótesis nula que en este caso sería que no hay asociación significativa de la varible dependiente en función de las categorías de la independiente.
***Por último miramos correlación entre las ventas y las variables categóricas grupo y fju.
chisq.test(dades$grupo, dades$VENTAS)
## Warning in chisq.test(dades$grupo, dades$VENTAS): Chi-squared approximation
## may be incorrect
##
## Pearson's Chi-squared test
##
## data: dades$grupo and dades$VENTAS
## X-squared = 4403, df = 4398, p-value = 0.4759
chisq.test(dades$fju, dades$VENTAS)
## Warning in chisq.test(dades$fju, dades$VENTAS): Chi-squared approximation
## may be incorrect
##
## Pearson's Chi-squared test
##
## data: dades$fju and dades$VENTAS
## X-squared = 4398, df = 4398, p-value = 0.4971
boxplot(dades$VENTAS~dades$grupo, xlab = "grupo", ylab = "Ventas")
boxplot(dades$VENTAS~dades$fju, xlab = "fju", ylab = "Ventas")
Realizar una tabla de contingencia entre Ventas y Número de empleados, una vez categorizadas ambas variables, para número de empleados, por ejemplo, la utilizada a nivel Europeo, la cual divide a las empresas en Microempresas (1-9 trabajadores), Pequeña empresa (10-49 trabajadores), Mediana empresa (50-249 trabajadores) y Gran empresa (250 y más trabajadores)).
La variable ventas la dividiremos basándonos en los cuartiles.
tipo_empresa = cut(dades$NÚMERO.DE.EMPLEADOS, breaks = c(0,10,50,250,Inf), labels = c("Microempresas", "Pequeña empresa", "Mediana empresa", "Gran empresa"), right = FALSE)
segmento_ventas = cut(dades$VENTAS, breaks = c(0,494.89,1592.14,7819,Inf), labels = c("Muy pocas ventas", "Pocas ventas", "Buenas ventas", "Muy buenas ventas"), right = FALSE)
df = data.frame(x=tipo_empresa, y=segmento_ventas)
colnames(df)=c("Tipo empresa", "Ventas")
summary(df)
## Tipo empresa Ventas
## Microempresas :2561 Muy pocas ventas :1101
## Pequeña empresa:1501 Pocas ventas :1100
## Mediana empresa: 341 Buenas ventas :1101
## Gran empresa : 0 Muy buenas ventas:1101
Ahora podemos combinar ambos data frames para ver los datos originales y nuestra clasificación propuesta:
df2=data.frame(dades$NÚMERO.DE.EMPLEADOS, tipo_empresa, dades$VENTAS, segmento_ventas)
summary(df2)
## dades.NÚMERO.DE.EMPLEADOS tipo_empresa dades.VENTAS
## Min. : 1.00 Microempresas :2561 Min. : 4.92
## 1st Qu.: 3.00 Pequeña empresa:1501 1st Qu.: 494.89
## Median : 7.00 Mediana empresa: 341 Median : 1592.14
## Mean : 16.34 Gran empresa : 0 Mean : 6648.16
## 3rd Qu.: 21.00 3rd Qu.: 7819.91
## Max. :169.00 Max. :77055.79
## segmento_ventas
## Muy pocas ventas :1101
## Pocas ventas :1100
## Buenas ventas :1101
## Muy buenas ventas:1101
##
##
Comparar las ventas entre Madrid y Barcelona.
Nuestra hipótesis nula es que las ventas son iguales, y la alternativa que las ventas no son iguales.
summary(dades$VENTAS[dades$PROVINCIA=="Madrid"])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.8 451.2 1827.7 8072.1 8622.3 73605.2
summary(dades$VENTAS[dades$PROVINCIA=="Barcelona"])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.92 590.37 1855.45 7599.87 9790.40 65683.80
Miramos la normalidad de ambas variables:
shapiro.test(dades$VENTAS[dades$PROVINCIA=="Madrid"])
##
## Shapiro-Wilk normality test
##
## data: dades$VENTAS[dades$PROVINCIA == "Madrid"]
## W = 0.61752, p-value < 2.2e-16
shapiro.test(dades$VENTAS[dades$PROVINCIA=="Barcelona"])
##
## Shapiro-Wilk normality test
##
## data: dades$VENTAS[dades$PROVINCIA == "Barcelona"]
## W = 0.65681, p-value < 2.2e-16
Hacemos boxplot para comparar de forma visual:
boxplot(dades$VENTAS[dades$PROVINCIA=="Madrid"], dades$VENTAS[dades$PROVINCIA=="Barcelona"], names = c("Madrid", "Barcelona"))
Finalmente Wilcox Test para comparar ambas variables con distribución no normal y muestras independientes:
wilcox.test(dades$VENTAS[dades$PROVINCIA=="Madrid"], dades$VENTAS[dades$PROVINCIA=="Barcelona"], alternative="two.sided")
##
## Wilcoxon rank sum test with continuity correction
##
## data: dades$VENTAS[dades$PROVINCIA == "Madrid"] and dades$VENTAS[dades$PROVINCIA == "Barcelona"]
## W = 124196, p-value = 0.2924
## alternative hypothesis: true location shift is not equal to 0
El test nos da una p>0.05 que significa que no podemos rechazar la hipotesis nula, por lo tanto aceptamos que las ventas son “iguales”.
Presentación del modelo de predicción de las ventas para el siguiente año y describirla adecuadamente.
mod_total=lm(dades$VENTAS~., data=dades)
summary(mod_total)
##
## Call:
## lm(formula = dades$VENTAS ~ ., data = dades)
##
## Residuals:
## Min 1Q Median 3Q Max
## -45650 -1473 15 1257 45304
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3477.6187 842.9156 -4.126 3.77e-05 ***
## PROVINCIAAlbacete -771.4173 1038.1342 -0.743 0.45747
## PROVINCIAAlicante 1442.9352 866.5865 1.665 0.09597 .
## PROVINCIAAlmería -1026.7817 1030.1211 -0.997 0.31894
## PROVINCIAAsturias 782.5455 943.9422 0.829 0.40714
## PROVINCIAÁvila -2115.7643 1407.5460 -1.503 0.13287
## PROVINCIABadajoz -542.9382 1008.0416 -0.539 0.59019
## PROVINCIABaleares 739.4238 901.2991 0.820 0.41203
## PROVINCIABarcelona 1813.2402 833.5663 2.175 0.02966 *
## PROVINCIABurgos -968.1719 1060.9833 -0.913 0.36154
## PROVINCIACáceres -1392.3448 1111.3246 -1.253 0.21032
## PROVINCIACádiz 139.4134 966.2567 0.144 0.88528
## PROVINCIACantabria -449.0154 1051.8625 -0.427 0.66949
## PROVINCIACastellón 288.1315 1004.6612 0.287 0.77428
## PROVINCIACEUTA -4633.3983 1571.0122 -2.949 0.00320 **
## PROVINCIACiudad Real -182.7733 1012.2809 -0.181 0.85672
## PROVINCIACórdoba 559.8192 955.4100 0.586 0.55794
## PROVINCIACuenca -2121.1568 1208.6096 -1.755 0.07932 .
## PROVINCIAGerona 745.7844 902.4406 0.826 0.40862
## PROVINCIAGranada -108.9618 995.6827 -0.109 0.91286
## PROVINCIAGuadalajara -1835.5224 1330.2767 -1.380 0.16772
## PROVINCIAGuipúzcoa 853.8803 999.1449 0.855 0.39281
## PROVINCIAHuelva -332.6200 1125.7756 -0.295 0.76766
## PROVINCIAHuesca 49.0760 1070.6014 0.046 0.96344
## PROVINCIAJaén -206.5978 993.7284 -0.208 0.83532
## PROVINCIALa Coruña -183.2086 906.8112 -0.202 0.83990
## PROVINCIALas Palmas 453.1893 947.7010 0.478 0.63253
## PROVINCIALeón -141.2414 991.3153 -0.142 0.88671
## PROVINCIALérida 611.4607 963.1530 0.635 0.52556
## PROVINCIALogroño 736.3097 1094.4935 0.673 0.50115
## PROVINCIALugo 38.5481 1005.4357 0.038 0.96942
## PROVINCIAMadrid 1216.9172 847.5758 1.436 0.15114
## PROVINCIAMálaga 995.3057 901.3543 1.104 0.26955
## PROVINCIAMELILLA -7996.1856 1857.4713 -4.305 1.71e-05 ***
## PROVINCIAMurcia 1467.2494 922.4837 1.591 0.11179
## PROVINCIANavarra 1253.9711 1021.2754 1.228 0.21957
## PROVINCIAOrense -1158.2984 1142.1422 -1.014 0.31057
## PROVINCIAPalencia -2599.8538 1327.9829 -1.958 0.05032 .
## PROVINCIAPontevedra 939.1657 932.0976 1.008 0.31371
## PROVINCIASalamanca -1557.5578 1090.5891 -1.428 0.15331
## PROVINCIASegovia -4693.4741 1442.4623 -3.254 0.00115 **
## PROVINCIASevilla 1552.0527 885.3439 1.753 0.07966 .
## PROVINCIASoria -6621.8118 1517.3425 -4.364 1.31e-05 ***
## PROVINCIASta. Cruz de Tenerife -271.1124 943.7339 -0.287 0.77391
## PROVINCIATarragona 499.8006 969.9027 0.515 0.60636
## PROVINCIATeruel -1693.6145 1211.1755 -1.398 0.16209
## PROVINCIAToledo 912.2677 973.9739 0.937 0.34899
## PROVINCIAValencia 1948.0868 859.4798 2.267 0.02346 *
## PROVINCIAValladolid -300.7586 1026.3034 -0.293 0.76950
## PROVINCIAVizcaya 1247.7018 928.6968 1.343 0.17918
## PROVINCIAZamora -2506.3351 1195.1701 -2.097 0.03605 *
## PROVINCIAZaragoza 1636.4636 948.6495 1.725 0.08459 .
## rentabieco 15.9461 6.0734 2.626 0.00868 **
## rentabifin 0.7555 1.1290 0.669 0.50344
## endp 5.3223 2.3299 2.284 0.02240 *
## liq 5.7587 13.9754 0.412 0.68031
## PRODUCTIVIDAD 72.8051 3.5697 20.395 < 2e-16 ***
## NÚMERO.DE.EMPLEADOS 388.4635 4.7500 81.781 < 2e-16 ***
## coe 72038.1086 3918.7066 18.383 < 2e-16 ***
## edad -25.8009 9.6694 -2.668 0.00765 **
## conce 5.4114 1.6495 3.281 0.00104 **
## numac 36.0670 50.8994 0.709 0.47862
## numpa 173.5887 102.1198 1.700 0.08923 .
## numest 308.8456 63.4762 4.866 1.18e-06 ***
## estp1 356.9063 425.7129 0.838 0.40187
## grupo1 573.5868 320.6835 1.789 0.07374 .
## fju1 483.9113 194.9862 2.482 0.01311 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4595 on 4336 degrees of freedom
## Multiple R-squared: 0.8335, Adjusted R-squared: 0.831
## F-statistic: 329 on 66 and 4336 DF, p-value: < 2.2e-16
plot(mod_total)
Nuestros coeficientes son -3127.03 para la constante, la beta 0, y nuestras beta 1 las que siguen en la fila estimate, explicadas seguidamente.
Con este modelo explicamos el 83% de la variabilidad de las ventas en función de las variables Productividad, Número de empleados, Cuota de mercado, Nº que dan este mismo servicio a nivel municipio y Nº de establecimientos en otras provincias.
Por lo tanto mis ventas predecidas iran en función delas beta comentadas anteriormente: + 1813.24 Provincia Barcelona + -4633.39 Ceuta + -7996.18 Melilla + -4693.47 Segovia + -6621.81 Soria + 1948.08 Valencia + -2506.33 Zamora + 15.94 Rentabilidad Económica + 5.32 Nivel endeudamiento económico + 72.80 Productividad + 388.46 Número de empleados + 72038.10 Cuota de mercado + 5.41 Nº entidades que dan el mismo servicio a nivel municipio + 308.84 Nº establecimientos por empresa + 483.91 FJU
En cuanto a los residuos, a mi entender están un poco dispersos sobretodo por la aprición de outliers, y se podría ajustar el modelo eliminando outliers. Recordemos que los residuos del modelo tienen que tener normalidad, homocesdasticidad (varianza constante), linealidad e independencia. Vemos que en los plots se concentran mucho a la izquierda del grçafico y en el qqplot hay “colas” acentuadas en la distribución.
Ahora vamos a crear un train set para comprobar el modelo y verificar su significancia:
train = sample(nrow(dades), round(nrow(dades))/5*4)
mod2=lm(dades$VENTAS~., data = dades, subset = train)
summary(mod2)
##
## Call:
## lm(formula = dades$VENTAS ~ ., data = dades, subset = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -44605 -1445 4 1239 46087
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.169e+03 9.391e+02 -3.375 0.000748 ***
## PROVINCIAAlbacete -1.188e+03 1.132e+03 -1.050 0.293845
## PROVINCIAAlicante 1.381e+03 9.628e+02 1.434 0.151670
## PROVINCIAAlmería -1.157e+03 1.154e+03 -1.002 0.316221
## PROVINCIAAsturias 7.143e+02 1.054e+03 0.678 0.497883
## PROVINCIAÁvila -2.319e+03 1.778e+03 -1.305 0.192126
## PROVINCIABadajoz -7.980e+02 1.132e+03 -0.705 0.480784
## PROVINCIABaleares 4.527e+02 1.002e+03 0.452 0.651576
## PROVINCIABarcelona 1.416e+03 9.280e+02 1.526 0.127015
## PROVINCIABurgos -1.526e+03 1.186e+03 -1.287 0.198056
## PROVINCIACáceres -1.716e+03 1.228e+03 -1.397 0.162404
## PROVINCIACádiz -1.124e+02 1.067e+03 -0.105 0.916133
## PROVINCIACantabria -8.313e+02 1.212e+03 -0.686 0.492776
## PROVINCIACastellón 4.709e+02 1.193e+03 0.395 0.692999
## PROVINCIACEUTA -7.347e+03 2.000e+03 -3.674 0.000243 ***
## PROVINCIACiudad Real -4.723e+02 1.107e+03 -0.427 0.669730
## PROVINCIACórdoba 1.756e+02 1.066e+03 0.165 0.869125
## PROVINCIACuenca -3.406e+03 1.435e+03 -2.373 0.017685 *
## PROVINCIAGerona 3.606e+02 1.004e+03 0.359 0.719562
## PROVINCIAGranada -1.502e+01 1.123e+03 -0.013 0.989326
## PROVINCIAGuadalajara -2.227e+03 1.389e+03 -1.603 0.109089
## PROVINCIAGuipúzcoa 7.303e+02 1.107e+03 0.660 0.509293
## PROVINCIAHuelva -1.124e+03 1.285e+03 -0.875 0.381741
## PROVINCIAHuesca -3.282e+02 1.216e+03 -0.270 0.787297
## PROVINCIAJaén -3.512e+02 1.124e+03 -0.313 0.754669
## PROVINCIALa Coruña -5.112e+02 1.017e+03 -0.503 0.615066
## PROVINCIALas Palmas -3.143e+02 1.067e+03 -0.294 0.768396
## PROVINCIALeón -5.498e+02 1.100e+03 -0.500 0.617152
## PROVINCIALérida 4.137e+02 1.096e+03 0.378 0.705779
## PROVINCIALogroño 6.492e+02 1.216e+03 0.534 0.593462
## PROVINCIALugo -1.331e+02 1.148e+03 -0.116 0.907752
## PROVINCIAMadrid 1.051e+03 9.441e+02 1.113 0.265621
## PROVINCIAMálaga 1.323e+03 1.010e+03 1.310 0.190322
## PROVINCIAMELILLA -1.033e+04 2.314e+03 -4.462 8.39e-06 ***
## PROVINCIAMurcia 1.530e+03 1.022e+03 1.497 0.134488
## PROVINCIANavarra 1.306e+03 1.136e+03 1.149 0.250467
## PROVINCIAOrense -1.645e+03 1.282e+03 -1.283 0.199594
## PROVINCIAPalencia -3.504e+03 1.493e+03 -2.348 0.018952 *
## PROVINCIAPontevedra 4.404e+02 1.037e+03 0.425 0.671032
## PROVINCIASalamanca -1.866e+03 1.229e+03 -1.518 0.129158
## PROVINCIASegovia -5.034e+03 1.570e+03 -3.206 0.001356 **
## PROVINCIASevilla 1.193e+03 9.840e+02 1.212 0.225581
## PROVINCIASoria -8.177e+03 1.667e+03 -4.905 9.79e-07 ***
## PROVINCIASta. Cruz de Tenerife -3.732e+02 1.047e+03 -0.356 0.721560
## PROVINCIATarragona 4.128e+02 1.080e+03 0.382 0.702440
## PROVINCIATeruel -1.757e+03 1.332e+03 -1.319 0.187160
## PROVINCIAToledo 7.443e+02 1.089e+03 0.684 0.494258
## PROVINCIAValencia 1.755e+03 9.570e+02 1.834 0.066812 .
## PROVINCIAValladolid -7.997e+02 1.129e+03 -0.709 0.478654
## PROVINCIAVizcaya 9.129e+02 1.034e+03 0.883 0.377330
## PROVINCIAZamora -3.076e+03 1.329e+03 -2.315 0.020672 *
## PROVINCIAZaragoza 1.232e+03 1.058e+03 1.164 0.244563
## rentabieco 1.746e+01 6.844e+00 2.551 0.010790 *
## rentabifin 1.883e-01 1.272e+00 0.148 0.882315
## endp 5.310e+00 2.545e+00 2.086 0.037021 *
## liq 5.778e+00 1.474e+01 0.392 0.695101
## PRODUCTIVIDAD 7.100e+01 4.057e+00 17.502 < 2e-16 ***
## NÚMERO.DE.EMPLEADOS 3.875e+02 5.369e+00 72.183 < 2e-16 ***
## coe 7.445e+04 4.431e+03 16.803 < 2e-16 ***
## edad -2.223e+01 1.084e+01 -2.051 0.040370 *
## conce 4.140e+00 1.836e+00 2.255 0.024189 *
## numac 4.606e+01 5.622e+01 0.819 0.412686
## numpa 7.075e+01 1.082e+02 0.654 0.513404
## numest 2.943e+02 7.006e+01 4.201 2.73e-05 ***
## estp1 4.508e+02 4.761e+02 0.947 0.343782
## grupo1 5.373e+02 3.551e+02 1.513 0.130410
## fju1 4.178e+02 2.185e+02 1.912 0.056019 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4611 on 3455 degrees of freedom
## Multiple R-squared: 0.8318, Adjusted R-squared: 0.8286
## F-statistic: 259 on 66 and 3455 DF, p-value: < 2.2e-16
plot(mod2)
preds=predict(mod2, newdata = dades[-train, ])
cor.test(dades[-train, ]$VENTAS, preds, method = "sp")
##
## Spearman's rank correlation rho
##
## data: dades[-train, ]$VENTAS and preds
## S = 13384142, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.8825604
Vemos que efectivamente el test nos da un 91% de exactitud, podemos explicar mucha varianza de las ventas con las variables de las que disponemos.
Pese a ello, vuelve a suceder algo muy parecido al modelo original, los residuos no acaban de estar dentro de valores seguros, en mi opinión es un modelo que se podría mejorar detectando y trabajando sobre los outliers.